﻿//----------------------------------------------------------------------------------------------------------------------
/*!
*   \file			ChaosLogManager.hpp
*	\author		sniperbat
*	\version		1.0
*	\date			2009-3-25
*	\brief		日志管理系统
*/
//----------------------------------------------------------------------------------------------------------------------
#ifndef	__CHAOSLOGMANAGER_HPP
#define	__CHAOSLOGMANAGER_HPP

#include "ChaosSingleton.hpp"
#include "ChaosLog.hpp"
#pragma warning(push)
#pragma warning(disable:4251)
//警告4251 :STL需要有dll接口由客户端使用
#include <map>
#include <xstring>
//using namespace std;


//----------------------------------------------------------------------------------------------------------------------
namespace Chaos
{


	#define LOGFILELOGGER					_T("LogFileLogger")
	#define ERRORFILELOGGER				_T("ErrorFileLogger")
	#define CONSOLELOGGER				_T("ConsoleLogger")

	typedef map<const std::wstring,ChsLog*> ChsLoggerList;

	class CHAOS_API ChsLogManager : public ChsSingleton<ChsLogManager>
	{
	public:
										ChsLogManager();
		virtual						~ChsLogManager();
		//---------------------------------------------------------------------------------------
		/*!
		* \fn		void	DoLog(const std::wstring& name,const LPCTSTR fmt,...)
		* \brief 将日志消息输出到指定的Log实例
		* \param name 需要操作的日志实例名字
		* \param fmt 日志消息
		*/
		void							DoLog(const std::wstring& name,const LPCTSTR fmt,...);
		//---------------------------------------------------------------------------------------
		/*!
		* \fn		void	AddLogger(wstring name,ChsLogger pLogger)
		* \brief 添加一个日志实例，类型可以是文件日志(FileLog),控制台日志(ConsoleLog)等
		* \param name 需要添加的日志实例的名字。
		* \param pLogger 日志实例的指针
		*/
		void						AddLogger(const std::wstring& name,ChsLog* pLogger);
		//---------------------------------------------------------------------------------------
		/*!
		* \fn		void	RemoveLogger(wstring name)
		* \brief 移除指定的日志实例
		* \param name 日志实例的名字
		*/
		void						RemoveLogger(const std::wstring& name);
		//---------------------------------------------------------------------------------------
		/*!
		* \fn		void	RemoveLoggerAll()
		* \brief 移除所有的日志实例
		*/
		void						RemoveLoggerAll();

	private:
		/// \brief 存放得到的系统时间的结构体
		SYSTEMTIME				m_systemTime;
		ChsLoggerList				m_loggers;
		TCHAR							m_chBuffer[512];
	};

	#define LOGMSG(fmt,...)			ChsLogManager::GetSingletonPtr()->DoLog(LOGFILELOGGER,_T(fmt),__VA_ARGS__);
	#define ERRMSG(fmt,...)			ChsLogManager::GetSingletonPtr()->DoLog(ERRORFILELOGGER,_T(fmt),__VA_ARGS__);


}

#pragma warning(pop)



#endif//__CHAOSLOGMANAGER_HPP

